Amiga Articles - Articoli Amiga
Analizziamo ora la differenza nel passaggio di parametri esterni dalla linea di comando; come molti di voi ben sanno, il passaggio di parametri dalla linea di comando in C si realizza nella dichiarazione del main():
int main(int argc, char *argv[]);
dove "argc" indica il numero di parametri passati ed argv è un vettore di stringhe le quali ovviamente corrispondono ai diversi parametri passati; la prima stringa è sempre il nome del programma. In Java il passaggio di parametri dalla linea di comando si realizza sempre in maniera molto similiare al C, stavolta viene passato un array di stringhe:
public static void main(String args[])
E questo basta ed avanza infatti qualsiasi array, come definito in Java, contiene già l'informazione sul numero di elementi; inoltre c'é da tener presente che il nome del programma non viene più passato come parametro.
Elenchiamo ora quello che nel C era presente e nel Java non lo è piu. Innanzitutto verifichiamo quali parole chiave non ci sono più; goto, sizeof e typedef sono state eliminate; il goto non era nemmeno utilizzato nel C, e in un linguaggio come il Java, robusto e orientato agli oggetti, perde di qualsiasi significato; sizeof forniva la grandezza in bytes di un dato, ma visto che in Java qualsiasi dato è stato precisamente definito, si conosce a priori la grandezza di qualsiasi elemento; typedef infine è stato eliminato per la caratteristica di semplicità del linguaggio, in quanto con typedef si definiscono degli "alias", vale a dire modi diversi di scrivere la stessa cosa. Sono inoltre stati eliminati questi tipi di dati dal C: struct, union, enum; questo per la caratteristica di programmazione orientata agli oggetti del Java, infatti la class basta ed avanza per qualsiasi definizione di dato (anche in C++ quelle parole erano praticamente ignorate, anche se mantenute per compatibilità). I modificatori di dichiarazione auto, extern, register, signed e unsigned, volatile sono stati anch'essi eliminati per i motivi or ora detti. Passiamo ora alla descrizione di una eliminazione più controversa, quella dei puntatori. Come abbiamo già detto più di una volta, per la caratteristica di sicurezza del linguaggio è stata rimossa la caratteristica dei puntatori, per evitare che i programmi scritti in Java possano in alcun modo arrecare danni sul sistema su cui girano. Comunque gran parte delle funzionalità implementate mediante i puntatori sono state rese disponibili in Java, come potete osservare dal listato 5.1; le principali funzionalità rese possibili in Java anche senza puntatori sono:
1 Inizializzazione dinamica
2 La possibilità che più oggetti non istanziati possano puntare ad un oggetto effettivo
3 L'abilità di controllare un valore NULL per oggetti non istanziati
4 Nessuna preoccupazione per la liberazione della memoria allocata, grazie al garbage collection
5 Dato che tutti gli oggetti sono considerati come figli di un unico oggetto radice, è possibile che oggetti non istanziati puntino ad oggetti di tipo differenti (svolgono la funzionalità dei puntatori void nel C)
6 Strutture dati auto-referenzianti come liste, alberi e grafi possono tranquillamente essere implementati. Java non può in alcun modo implementare invece queste caratteristiche permesse dai puntatori in C:
1 Passaggio dati by-reference; in Java infatti, anche se vengono passati gli indirizzi degli oggetti, questi non possono essere modificati
2 Puntatori a funzioni; anche se è possibile rimediare parzialmente al problema con le funzioni virtuali e l'ereditarietà, non è possibile puntare direttamente a una funzione.
Un'altra caratteristica del C rimossa dal Java, è il preprocessore; il preprocessore secondo l'ottica del Java è da considerarsi potenzialmente confusionario e quindi complica la vita al programmatore (come anche sottolineato da Stroustrup, l'inventore del C++). Infine un'altra caratteristica importante eliminata è stata la possibilità di passare un numero variabile di argomenti in una funzione; tuttavia questa caratteristica è ancora realizzabile in Java, utilizzando la classe Vector; con vector è infatti possibile passare un vettore con un qualsiasi numero di dati, dati anche non omogenei. Anche per questa puntata è tutto vi salutiamo e arrivederci alla prossima!